{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 注意！请根据提示操作！\n",
    "\n",
    "如果当页面加载完成，你还是看到了这条提示\n",
    "\n",
    "那么你的notebook并未被信任，导致代码无法正常运行\n",
    "\n",
    "点击右上角的`不可信`，将本notebook列入可信列表，即可正常运行。\n",
    "\n",
    "![可信按钮](./mgr/trust.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模块\n",
    "\n",
    "路径处理是我们常常需要的功能。例如之前章节中的的[相对路径与绝对路径](012T-【测试】相对路径与绝对路径.ipynb)。\n",
    "\n",
    "如果这些功能有人帮我们写完了，我们只要调用下函数就好了，岂不是很方便？\n",
    "\n",
    "Python的开发者也想到了这个点子。在Python中存在非常多的前人写完的功能，供后人使用。\n",
    "\n",
    "这些功能可以分成三种：\n",
    "\n",
    "## 1. 内置函数\n",
    "\n",
    "例如print等，直接内置在Python中，可以直接使用的。下面是常见的内置函数：\n",
    "\n",
    "```python\n",
    "print()  # 打印输出\n",
    "min()  # 求最小值\n",
    "max()  # 求最大值\n",
    "input()  # 获取输入\n",
    "str()  # 将变量转换成字符串类型\n",
    "int()  # 将变量转换成整数类型\n",
    "```\n",
    "\n",
    "## 2. 官方模块\n",
    "\n",
    "官方包含了更多的常用模块，但是使用它们的时候需要先用import关键字来引入，例如os模块中包含了处理系统路径相关的功能，我们可以这么用："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os  # 导入os模块\n",
    "p = os.path.relpath('/apt/source/source.list', '/apt')  # 使用os模块中的path子模块中的relpath函数获取相对路径\n",
    "print(p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "常见的官方模块有：\n",
    "\n",
    "```python\n",
    "os  # 系统相关的，包括路径等\n",
    "pathlib  # 新的对于路径相关的规划，比os.path中的功能更强大更合理\n",
    "sys  # 系统相关的功能，例如退出程序，获取系统参数等\n",
    "random  # 随机相关的功能，例如随机数生成等\n",
    "time  # 时间相关\n",
    "datetime  # 日期与时间相关\n",
    "math  # 数学相关的功能\n",
    "shutil  # 文件操作的功能，例如复制、移动、删除文件、文件夹等\n",
    "subprocess  # 进程功能，例如打开一个浏览器，打开某个路径，运行某个文件等\n",
    "urllib  # 网络相关的功能，可以用来做爬虫，不过有更好的选择，下面会提及\n",
    "```\n",
    "\n",
    "## 3. 第三方模块\n",
    "\n",
    "有些功能官方也没有提供，但是又很有需求，就有很多第三方将这些模块开发完成后发布出来给大家用。\n",
    "\n",
    "使用第三方模块的时候，需要先安装模块，安装完后可以和官方模块一样的方式调用。\n",
    "\n",
    "大部分模块，都用了一个统一的模块管理系统来管理，这就是python的包管理系统，简称pip。(有些模块的安装方法不一样，需要去看模块开发者的安装说明)\n",
    "\n",
    "pip安装模块的方式非常简单，例如有个模块requests，是用于抓去网络上的内容的，Python官方模块中并未携带，运行以下代码即可安装(注意开头有个感叹号，意味着运行系统命令。这和在cmd中运行是一个效果)："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install requests"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "安装完之后，你就可以在代码中通过import requests来调用这些模块里的功能了。\n",
    "\n",
    "当然如果你想安装其它模块，一般只需要将requests改成你想要安装的模块名字即可。\n",
    "\n",
    "## 简便写法\n",
    "\n",
    "模块除了直接import，还可以用一些简便的写法，例如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from os.path import relpath  # 将relpath单独引入\n",
    "p = relpath('/apt/source/source.list', '/apt')  # 直接使用relpath即可。\n",
    "print(p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "还有一种别名的方法，可以把某些库换一个名字，例如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os as o  # o将是os的别名，通过这种方法，可以在以后用o代替os这个库\n",
    "p = o.path.relpath('/apt/source/source.list', '/apt')  # 直接使用relpath即可。\n",
    "print(p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 补充说明\n",
    "\n",
    "有些模块不仅是Python中会需要调用，可能也有很大的单独使用的需求。所以有些模块在安装完之后，还会顺带“附送”一个直接的执行命令，让你不用启动Python就可以直接使用此功能。\n",
    "\n",
    "例如[You-Get](https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E)模块，就是可以帮你把网络上的在线视频抓取保存下来的模块。它就提供了直接的命令行使用，可以按照如下代码先安装再在命令行中直接使用。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install you-get -i https://pypi.douban.com/simple  # 安装you-get，-i之后的选项是把安装服务器切换到国内豆瓣的，加快安装速度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!you-get -o D:\\ https://www.bilibili.com/video/av59209145  # 抓取这个B站的视频，存放到D盘中。你可以将D:\\修改为自己想放的路径，由于网站的反下载机制可能会时不时的升级，有的时候不一定抓取成功。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<hr>\n",
       "<link rel=\"stylesheet\" href=\"//cdn.bootcss.com/mdui/0.4.3/css/mdui.min.css\">\n",
       "<script src=\"./mgr/submit.js\"></script>\n",
       "<script src=\"./mgr/hide.js\"></script>\n",
       "<div class=\"mdui-container-fluid\">\n",
       "    <div class=\"mdui-col-xs-3\">\n",
       "        <button class=\"mdui-btn mdui-btn-raised mdui-ripple mdui-color-blue-grey-500\" onclick=\"next_page(-1)\">上一章</button>\n",
       "    </div>\n",
       "    <div class=\"mdui-col-xs-3\">\n",
       "        <button class=\"mdui-btn mdui-btn-raised mdui-ripple mdui-color-blue-grey-700\" onclick=\"window.open('/tree')\">目录</button>\n",
       "    </div>\n",
       "    <div class=\"mdui-col-xs-3\">\n",
       "        <button class=\"mdui-btn mdui-btn-raised mdui-ripple mdui-color-blue-grey-900\" onclick=\"next_page(1)\">下一章</button>\n",
       "    </div>\n",
       "</div>\n",
       "<div id=\"html_output\">\n",
       "</div>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%html\n",
    "<hr>\n",
    "<link rel=\"stylesheet\" href=\"//cdn.bootcss.com/mdui/0.4.3/css/mdui.min.css\">\n",
    "<script src=\"./mgr/submit.js\"></script>\n",
    "<script src=\"./mgr/hide.js\"></script>\n",
    "<div class=\"mdui-container-fluid\">\n",
    "    <div class=\"mdui-col-xs-3\">\n",
    "        <button class=\"mdui-btn mdui-btn-raised mdui-ripple mdui-color-blue-grey-500\" onclick=\"next_page(-1)\">上一章</button>\n",
    "    </div>\n",
    "    <div class=\"mdui-col-xs-3\">\n",
    "        <button class=\"mdui-btn mdui-btn-raised mdui-ripple mdui-color-blue-grey-700\" onclick=\"window.open('/tree')\">目录</button>\n",
    "    </div>\n",
    "    <div class=\"mdui-col-xs-3\">\n",
    "        <button class=\"mdui-btn mdui-btn-raised mdui-ripple mdui-color-blue-grey-900\" onclick=\"next_page(1)\">下一章</button>\n",
    "    </div>\n",
    "</div>\n",
    "<div id=\"html_output\">\n",
    "</div>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
